package com.sky.demo.proxy.dynamicproxy;

import com.sky.demo.proxy.staticproxy.IRentingHouse;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Description:
 *  动态代理工厂类 单例
 * @author Sky
 * @Date 2021/7/31 14:33
 */
public class ProxyFactory {

    private ProxyFactory(){}

    public static final ProxyFactory INSTANCE = new ProxyFactory();

    /**
     *  使用JDK动态代理获得代理对象
     * @param object 委托对象
     * @return 代理对象
     */
    public Object getJdkProxy(Object object){
        return Proxy.newProxyInstance(
                object.getClass().getClassLoader(),
                object.getClass().getInterfaces(), new InvocationHandler() {

                    /**
                     * @param proxy 代理对象本身
                     * @param method 调用的方法，动态 指定
                     * @param args 方法参数
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object proxyObj;
                        System.out.println("收取中介费3000元");
                        // 调用 原有 业务逻辑
                        proxyObj = method.invoke(object, args);

                        System.out.println("卖客户信息3毛钱");

                        return proxyObj;
                    }
                });
    }

    /**
     * 使用cglib动态代理获得代理对象
     * @param obj 委托对象
     * @return 代理对象
     */
    public Object getCglibProxy(Object obj){
        return Enhancer.create(obj.getClass(), new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Object proxyObj = null;

                System.out.println("收取中介费3000元");

                method.invoke(obj, objects);

                System.out.println("卖客户信息3毛钱");

                return proxyObj;
            }
        });
    }
}
